//
//  String+Date.swift
//  TTCOM
//
//  Created by Toj on 8/1/22.
//

import Foundation

/**
 * 总结:
 * Date 类型是UTC 时间
 * date.to_string UTC -> 本地时间
 * dateString.to_date 本地时间 -> UTC时间
 * 如果服务器返回的是UTC 时间, 必须加上Z的信息 Z == +0000
 * 如果没有返回Z则认为是当前时区的时间, Date 会转换到UTC时间
 * e.g.:
 * "2023-11-09T07:22:13.000+0000"  -> Date
 * +0000代表UTC时间,  date: 2023-11-09 07:22:13.000+0000
 * -0800代表西8区时间, date: 2023-11-09 15:22:13.000+0000
 * +0800代表东8区时间, date: 2023-11-08 23:22:13.000+0000
 */

public enum NSDFLocale: String {
    case system = "system" // 系统的随地区
    case zh_CN  = "zh_CN"   // 中国
    case en     = "en"      //
    case en_US  = "en_US"   // 美国
    case fr_FR  = "fr_FR"   // 法国
}

public enum NSDFTimeZone: String {
    case system = "System" // 系统的随地区
    case ccd = "CCD" // 中国标准时间
    case gmt = "GMT" // 格林威治标准时间
    case utc = "UTC" // 校准的全球时间
}

public extension String {
    
    func to_gmt(_ format: String = "yyyy-MM-dd HH:mm:ss") -> Date? {
        return to_date(format)
    }
    
    func to_utc(_ format: String = "yyyy-MM-dd HH:mm:ss") -> Date? {
        return to_date(format)
    }
    
    func to_date(_ format: String = "yyyy-MM-dd HH:mm:ss") -> Date? {
        if format.isEmpty { return nil }
        
        let df = DateFormatter()
        df.dateFormat = format
        
        let date = df.date(from: self)
        return date
    }
    
    /**
     将一种Date转换一个新格式
     - parameter fformat: 字符串目前的格式
     - parameter tformat: 转换后的格式
     - returns          : 当地时间
     
     - NOTE: date从一种格式转换新格式, 必须要先将旧时间字符串格式转成时间类型, 在转成新的格式字符串, 否则有些情况会报错
     */
    func to_format(from ftype: NSDateFormatType, to ttype: NSDateFormatType) -> String {
        return to_format(from: ftype.rawValue, to: ttype.rawValue)
    }
    
    /**
     将一种Date转换一个新格式
     - parameter fformat: 字符串目前的格式
     - parameter tformat: 转换后的格式
     - returns          : 当地时间
     
     - NOTE: date从一种格式转换新格式, 必须要先将旧时间字符串格式转成时间类型, 在转成新的格式字符串, 否则有些情况会报错
     */
    func to_format(from fformat: String, to tformat: String) -> String {
        guard !isEmpty else { return "" }
        
        let df = DateFormatter()
        df.dateFormat = fformat
        
        guard let date = df.date(from: self) else { return "" }
        df.dateFormat = tformat
        
        let result = df.string(from: date)
        return result
    }
    
    /**
     * 根据00:00:00时间格式 转换成秒
     * e.g.: "01:02:03"
     * 1. 分解: "01:02:03" = [01, 02, 03]
     * 2. 反转: [03 02 01]
     * 3. 计算
     */
    var to_seconds: UInt {
        var seconds: UInt = 0
        guard !isEmpty else { return seconds }
        
        let times = components(separatedBy: ":")
        guard !times.isEmpty else { return seconds }
        
        var index: UInt = 0
        var multiple: UInt = 1
        for time in times.reversed() {
            guard index < 3 else { break }
            var t = UInt(time) ?? 0
            // 时分容错
            if index < 2 && t > 59 {
                t = 59
            }
            seconds += (multiple * t)
            multiple = multiple * 60
            index += 1
        }
        return seconds
    }
}

// MARK: - 时间格式化: 通用
public extension String {
    
    /**
     时间 梯度格式化
     - 区间(今年, ~): yyyy-MM-dd(x年x月x日)
     - 区间[非今日, 今年]:
     - 1. 区间[昨天]: "昨天 HH:mm"
     - 2. 区间[非昨天, 今年]: "MM-dd"
     - 区间[~, 今日]:
     - 1. 区间[1时, 今日]: "n小时前"
     - 2. 区间[1分, 1时): "n分钟前"
     - 3. 区间[0秒, 1分): "刚刚"
     */
    func to_dateSeries(equally date: Date, dateFormat: String = "yyyy-MM-dd HH:mm:ss") -> String {
        let formatter = DateFormatter()
        formatter.dateFormat = dateFormat
        guard let selfDate = to_date(formatter.dateFormat) else { return "" }
        return selfDate.to_dateSeries(equally: date)
    }
    
    /**
     时间 梯度格式化
     - 区间(今年, ~): yyyy-MM-dd(x年x月x日)
     - 区间[非今日, 今年]:
     - 1. 区间[昨天]: "昨天 HH:mm"
     - 2. 区间[非昨天, 今年]: "MM-dd"
     - 区间[~, 今日]:
     - 1. 区间[1时, 今日]: "n小时前"
     - 2. 区间[1分, 1时): "n分钟前"
     - 3. 区间[0秒, 1分): "刚刚"
     */
    var to_dateSeries: String {
        // let date = Date(timeIntervalSince1970: 1699581600)
        let date = Date()
        return to_dateSeries(equally: date)
    }
}

// MARK: - 时间格式化: ST
public extension String {
    
    /**
     ST(四达)时间梯度, 发布时间显示规则
     - 区间(今年, ~): yyyy-MM-dd(x年x月x日)
     - 区间[1天, 今年]: MM-dd(x月x日)
     - 区间[30分钟, 1天): HH:mm(24小时制)
     - 区间[0, 30分钟): 刚刚
     */
    func st_dateSeries(equally date: Date, dateFormat: String = "yyyy-MM-dd HH:mm:ss") -> String {
        let formatter = DateFormatter()
        formatter.dateFormat = dateFormat
        guard let selfDate = to_date(formatter.dateFormat) else { return "" }
        return selfDate.st_dateSeries(equally: date)
    }
    
    /**
     ST(四达)时间梯度, 发布时间显示规则
     - 区间(今年, ~): yyyy-MM-dd(x年x月x日)
     - 区间[1天, 今年]: MM-dd(x月x日)
     - 区间[30分钟, 1天): HH:mm(24小时制)
     - 区间[0, 30分钟): 刚刚
     */
    var st_dateSeries: String {
        // let date = Date(timeIntervalSince1970: 1699581600)
        let date = Date()
        return st_dateSeries(equally: date)
    }
}
